#pragma once
#include <map>
#include "RBTree.h"


namespace Map
{
	template<class K, class V>
	class map
	{
		struct MapOfT
		{
			K operator()(const std::pair<K, V>& kv)
			{
				return kv.first;
			}
		};

	public:
		typedef typename wjh::RBTree<K, std::pair<const K, V>, MapOfT>::iterator iterator;
		typedef typename wjh::RBTree<K, std::pair<const K, V>, MapOfT>::const_iterator const_iterator;

		iterator begin()
		{
			return _t.begin();
		}

		iterator end()
		{
			return _t.end();
		}

		bool insert(const std::pair<K, V>& kv)
		{
			return _t.insert(kv);
		}

	private:
		wjh::RBTree<K, std::pair<const K, V>, MapOfT> _t;
	};

	void Test_Map1()
	{
		map<int, int> t;
		t.insert(std::make_pair(1,1));
		t.insert(std::make_pair(3, 3));
		t.insert(std::make_pair(5, 5));
		t.insert(std::make_pair(45, 4));
		t.insert(std::make_pair(6, 4));
		t.insert(std::make_pair(7, 4));
		t.insert(std::make_pair(48, 4));
		t.insert(std::make_pair(41, 4));

		map<int, int>::iterator it = t.begin();
		while (it != t.end())
		{
			std::cout << it->first << " ";
			++it;
		}

		std::cout << std::endl;
	}
}
